查看原文
其他

【万泉河】设备的设定参数&&数据块的运行值

万泉河0031 SCADA在线助手 2023-07-10


       

这其实是一回事。
       

只是观察者身份不同, 视角不同而已。
       

大部分设备, 都会有一些参数需要在运行中更改设置。          比如因为环境季节的变化, 或者原材料性能参数的变化, 设备的温度压力或者一些时间参数,需要操作员运行中根据实际工艺要求进行修改。


这些修改过的参数, 一定得能断电保存。不能够PLC断电重启了, 参数就全丢了, 还需要从头再设置一遍。 那很多时候就出事故了。 因为参数设置不完整, 系统运行不在最优状态, 生产线出废品, 甚至都不能正常运转。


断电保存这件事, 对PLC的功能来说, 曾经是个比较严重的事。 像S7-200,只有前面十几个字节的M区,可以设置为断电保存, 而整个V区, 是可以短时间内的断电保存,但时间长一点, 也丢了。 要想长期保存, 还得加电池。
   

而S7-300, 在程序卡升级为小卡的MMC之后,就完全解决了这个问题。 数据块中的运行数据,全都是可以断电保存的, 所以参数也不需要归拢在一个公共区域内了,到处都可以。 这就为模块化编程打好了基础。
   

比方说,一种类型的同样两台设备, 工艺运行中设定值不一样,现在就可以在各自的实例中保存各自不同的参数。 而不需要特别整理存储区域了。
   

到了S7-1200/1500,这个问题更简洁了。 对于优化的数据块,每个数据都可以单独设置是否保存。 非优化的数据块, 整个数据块设置为保存或不保存。 然后整个系统算总账,根据CPU不同, 可用的断电保持数据量不一样。 所以新的系统应该尽量使用优化数据块。
   

运行数据固然要运行中设置好了以后保存, 但程序编写时, 如果完全空着,留给运行以后再逐个设置。 那样程序上线后,即便程序本身逻辑都没有问题,但手动设置参数的工作量太大, 稍有疏忽, 也容易出安全事故。
   

比方说, 系统工艺规定的某个测点的温度值超过了一定的范围, 比如大概85度-90度,就要开启一系列安全设备。 而如果这个参数值没有设置,为0呢, 那程序一运行,就导致相关安全设备误启动了。至少,各种报警提示乱响,也怪吓人的。
   

所以, 对于这些参数值, 还需要一个默认的初始值。


嗯, 初始值。


有人会说了, 咦,就一个初始值的简单事,绕这么多弯子,费这么大的劲。


嗯。 没办法呀, 不从头讲起, 好多人不明白这事的来龙去脉, 后面的分析看不懂。
   

初始值的问题, 在计算机系统里很平常。 比如我们都知道的系统注册表, INI文件等, 保存的是软件的参数值。 在读取参数值的时候,可以约定默认值。 如果读取失败,至少有一个靠点谱的默认值,不至于因为参数值丢失而软件整个儿乱掉。
   

像读取INI文件的API函数:


 DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)
--------------------- 本文来自 FlyingTiger_Sun 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/vistas_fh/article/details/8894510?utm_source=copy
   

够清晰简单吧?

然而在PLC程序里,就没那么容易了。 
   

比方说, 一个模拟量处理的FB,当然可以用于所有类型的模拟量。 比如一个是温度,上下限范围是0-100 deg 。另一个是压力,0-10 bar。FB的定义, 只能有1个默认值,同样, 高低限的报警值, 也只能一套, 要么90,要么9。那么在调用FB块的时候, 这个管脚怎么写?


   

我们都知道, FB的INPUT管脚是可以不输入具体数值和参数, 而留空的。 留空就意味着这个管脚这里是默认值。那不是默认值的, 调用时就要输入,比如上限报警值可以输入88.0 。


但是,问题来了:

输入88.0之后,这个管脚就固化了, 不能参数化, 不能修改了!


以后要改,还需要用编程器来改程序。这绝不符合我们的本意。
   

或许有一个办法,可以在实例创建完成以后, 钻到背景数据块里面改这个管脚的对应值。 是否好用,我甚至没有尝试过。 因为, 这种方式太隐蔽了, 根本没办法对照检查!


而且, 我认为, 对于模块化编程来说, 最好的方法是同一个对象, 所有参数,通道地址,标定值上下限值,报警值,乃至物理单位等, 在同一个完整的界面里实现, 那样容易批量化。对于动辄几百点乃至上千点的系统来说, 可以更好地节省时间。
   

比如, 我曾经做到的用SCL调用的程序:


//    V209    (IN_INT:="    AI2_00    ",HI_LIM:=    5    ,LO_LIM:=    0    ,Unit:='    m     ' ,INSTANCE:='    软化水箱液位    ');
//    V210    (IN_INT:="    AI2_01    ",HI_LIM:=    10    ,LO_LIM:=    0    ,Unit:='    Bar     ' ,INSTANCE:='    软化水补水压力    ');
//    V211    (IN_INT:="    AI2_02    ",HI_LIM:=    100    ,LO_LIM:=    -50    ,Unit:='    °C     ' ,INSTANCE:='    冷却塔供水温度    ');
//    V212    (IN_INT:="    AI2_03    ",HI_LIM:=    10    ,LO_LIM:=    0    ,Unit:='    Bar     ' ,INSTANCE:='    冷却塔供水压力    ');
//    V213    (IN_INT:="    AI2_04    ",HI_LIM:=    1    ,LO_LIM:=    0    ,Unit:='         ' ,INSTANCE:='    备用    ');
//    V214    (IN_INT:="    AI2_05    ",HI_LIM:=    100    ,LO_LIM:=    -50    ,Unit:='    °C     ' ,INSTANCE:='    闭式冷却塔供水温度    ');
//    V215    (IN_INT:="    AI2_06    ",HI_LIM:=    100    ,LO_LIM:=    -50    ,Unit:='    °C     ' ,INSTANCE:='    闭式冷却塔回水温度    ');
//    V216    (IN_INT:="    AI2_07    ",HI_LIM:=    200    ,LO_LIM:=    0    ,Unit:='    m3/h     ' ,INSTANCE:='    闭式冷却塔循环水流量    ');
//    V217    (IN_INT:="    AI3_00    ",HI_LIM:=    600    ,LO_LIM:=    0    ,Unit:='    °C     ' ,INSTANCE:='    1#锅炉烟气温度    ');
     
   

//    U011        (Run :=%     I0.0    ,       Fault :=%     I0.1    ,       Comment := '    1#冷冻水泵    ');
//    U012        (Run :=%     I0.2    ,       Fault :=%     I0.3    ,       Comment := '    2#冷冻水泵    ');
//    U013        (Run :=%     I0.4    ,       Fault :=%     I0.5    ,       Comment := '    1#冷却水泵    ');
//    U014        (Run :=%     I0.6    ,       Fault :=%     I0.7    ,       Comment := '    2#冷却水泵    ');
//    U015        (Run :=%     I1.0    ,       Fault :=%     I1.1    ,       Comment := '    3#冷冻水泵    ');
//    U016        (Run :=%     I1.2    ,       Fault :=%     I1.3    ,       Comment := '    4#冷冻水泵    ');
//    U017        (Run :=%     I1.4    ,       Fault :=%     I1.5    ,       Comment := '    3#冷却水泵    ');
//    U018        (Run :=%     I2.0    ,       Fault :=%     I2.1    ,       Comment := '    热水循环泵    ');
//    U019        (Run :=%     I2.2    ,       Fault :=%     I2.3    ,       Comment := '    1#空压机循环水泵    ');


明眼人一定一眼就看透了。
   

没错!用EXCEL生成的。


原始数据表是这样的:


   

在校对完成后, 大部分的具体编程工作在EXCEL里完成的。


我以前写过文章:《【万泉河】EXCEL是个好工具》http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1467087&b_id=82&b_sid=19&s_id=&num=21#anch


有印象的同学可以跳转去重温一下。 没印象的不妨一读。
   

总之, 你不光要有编程的能力, 要想工作效率高,EXCEL也得能玩的很溜才行。 我玩的还行,如果觉得这方面也需要提高的也同样可以向我拜师学艺。
   

当然啦, 我推行的高效率工作的标准化PLC编程方式, 这里谈到的只是其中一点点思考。 其他方面的细节还有很多很多,很多。


更大的计划详见:

【万泉河】一个完全不使用T和M全局变量的好标准的PLC程序分享计划




本号历史文章还有:

【万泉河】不会翻墙的自动化工程师不是好工程师

【万泉河】一个完全不使用T和M全局变量的好标准的PLC程序分享计划

【万泉河】远程调试功能实现成本高于PLC价格是行业悲剧

【万泉河】我理想中的PLC调试工作方式

【万泉河】WINCC干掉WINDOWS桌面

【万泉河】创新与守规矩


 


   


   


 


       


       


   


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存